import {
  useAttrs,
  defineProps,
  defineEmits,
  defineOptions,
  getCurrentInstance,
  computed,
} from "vue";
const globalHook = () => {
  const { proxy } = getCurrentInstance();

  // 自动地继承 attribute默认true
  defineOptions({
    inheritAttrs: false,
  });

  /**
   * 过滤一些不需要透传的属性
   * excludeAttrs 需要排除的属性名 数组
   *
   */
  const $attrs = useAttrs();

  const _$attrs = computed(() => (excludeAttrs = []) => {
    let newAttrs = {};
    // 不需要的属性名
    const _excludeAttrs = excludeAttrs;
    // 遍历 $attrs
    //对象循环
    for (const key in $attrs) {
      if (Object.hasOwnProperty.call($attrs, key)) {
        const element = $attrs[key];
        // console.log(element, key);
        // 如果属性名不在 excludeAttrs 中，则添加到 newAttrs 中
        if (!_excludeAttrs.includes(key)) {
          newAttrs[key] = element;
        }
      }
    }

    return newAttrs;
  });

  /**
   * 获取新对象，过滤一些不需要的属性
   * @param {Object} oldObj  需要过滤的对象
   * @param {Array} excludeKeys  需要排除的属性名数组
   */

  const getNewObj = (oldObj = {}, excludeKeys = []) => {
    if (!oldObj instanceof Object) {
      throw new Error("oldObj must be an object");
    }
    let newAttrs = {};
    // 不需要的属性名
    const _excludeAttrs = excludeKeys || [];
    // 遍历 $attrs
    //对象循环
    for (const key in oldObj) {
      if (Object.hasOwnProperty.call(oldObj, key)) {
        const element = oldObj[key];
        // console.log(element, key);
        // 如果属性名不在 excludeAttrs 中，则添加到 newAttrs 中
        if (!_excludeAttrs.includes(key)) {
          newAttrs[key] = element;
        }
      }
    }

    return newAttrs;
  };

  //获取新对象
  return {
    _$attrs,
    getNewObj,
  };
};
export default globalHook;
